//
//  AuthViewModel.swift
//  weibo1
//
//  Created by 代亚洲 on 16/4/20.
//  Copyright © 2016年 itcast. All rights reserved.
//

import UIKit
import SVProgressHUD


class AuthViewModel: NSObject {
    
    //   可以将这个viewmodel设计成单例
    static let sharedViewModel : AuthViewModel = AuthViewModel()
    
    override init() {
        super.init()
        // 代表当当前 ViewModel 初始化的时候，就尝试去沙盒中读取数据
        account = self.accountInSanbox()
    }
    
    // 当前登录的用户的帐户信息 --
    var account: HMUserAccount?
    
    var accessToken: String? {
        return self.account?.access_token
    }
    
//    判断当前用户是否登录
    var islogin: Bool {
        
        //        guard let accessToken = self.account?.access_token else {
        //        如果没有accessToken就代表没有登录，所以return false
        if accessToken == nil   {
            
            return false
        }
        
        // 2. 判断 accessToken 是否过期
        // 如果判断 accessToken 是否过期 --> 取到过期时间，与当前时间进行对比，如果过期时间比当前时间小，就代表过期
        
        // 取到过期时间
//        print(self.account?.expiresDate)
        guard let expiresDate = self.account?.expiresDate else {
           
            return false
        }
        // 与当前时间进行对比  --> 当前时间比过期时间小 return true
//         print(expiresDate,NSDate())
        if NSDate().compare(expiresDate) == .OrderedAscending {
            // 没有过期，就返回true （代表登录）
//            print(NSDate().compare(expiresDate)   )
            return true
        }
        return false
    }
    
        
    
    
    
    //    加载 accessToken
   func loadAccessToken(code : String ,finished:(isSuccess : Bool)->()){
        //        请求地址
        let urlstring = "https://api.weibo.com/oauth2/access_token"
        
        //       json  有这些数据才能获得 accessToken
        let params = [
            
            "client_id": WB_APP_KEY,//申请应用时分配的AppKey。
            "client_secret": WB_APP_SECRET,//申请应用时分配的AppSecret
            "grant_type": "authorization_code",//请求的类型，填写authorization_code
            "code": code,//调用authorize获得的code值。
            "redirect_uri": WB_REDIRECT_URI//回调地址，需需与注册应用里的回调地址一致
        ]
        //        post请求
        NetWorkToolsAFN .sharedTolls.request(RequestMethod.Post, url: urlstring, parameters: params) { (responseObject, error) -> () in
            
            if error != nil {
                finished(isSuccess: false)
                return
            }
            
            //            print("-----------------------------请求成功：\(responseObject)")
            // 在公司里面开发的话，如果数据是字典，尽量要把其转成模型去使用
            // 如果 as 是写在 if let 或者 guard 里面，都使用 as?
            guard let dic = responseObject as? [String : AnyObject] else{
                
                finished(isSuccess: false)
                
                return
            }
            //            字典转模型
            let accont = HMUserAccount(dict: dic)
            
            // accessToken 获取到了，获取个人信息  因为在闭包里面所以要用self
            self.loadUserInfo(accont,finished: finished)
        }
    }
    //    个人信息
    private func loadUserInfo(accont : HMUserAccount,finished:(isSuccess : Bool)->()){
        
        //        获取地址
        let  urlstr = "https://api.weibo.com/2/users/show.json"
        //        转成功才合并  有着两个数据才能返回 个人信息
        let params = [
            "access_token" : accont.access_token ?? "",
            "uid" : accont.uid ?? ""
        ]
        //        发送请求
        NetWorkToolsAFN.sharedTolls.request(RequestMethod.Get, url: urlstr, parameters: params) { (responseObject, error) -> () in
            
            if error != nil {
                
                finished(isSuccess: false)
                
                SVProgressHUD.showErrorWithStatus("网络错误")
                return
            }
            
            //            判断返回的数据是不是字典
            // 在公司里面开发的话，如果数据是字典，尽量要把其转成模型去使用
            // 如果 as 是写在 if let 或者 guard 里面，都使用 as?
            guard let dic = responseObject as? [String : AnyObject] else{
                
                finished(isSuccess: false)
                
                return
            }
            //            赋值用户信息
            
            accont.name = dic["name"]as? String
            accont.avatar_large = dic["avatar_large"]as? String
            
//要在赋值给传进来的额accont 不然会在第一次运行的时候没数据
            self.account = accont
            //            保存数据
           self.saveAccont(accont)
//        要返回数据
            finished(isSuccess: true)
       
        }
    }
    
    //    保存数据信息
    
    private func saveAccont(accont : HMUserAccount){
        
        // 归档的路径 ： document路径 + 文件名  存储文件的路径
        let path = (NSSearchPathForDirectoriesInDomains(NSSearchPathDirectory.DocumentDirectory, NSSearchPathDomainMask.UserDomainMask, true).last! as NSString).stringByAppendingPathComponent("account.archive")
        
        //           print("----------------------------%@",path)
        //        归档  把文件存储到path的这个路径中
        NSKeyedArchiver.archiveRootObject(accont, toFile: path)
    }
    
    //    读档  读取沙盒中保存的数据
    private func accountInSanbox()->HMUserAccount?{
        //        读档的路径
        let path = (NSSearchPathForDirectoriesInDomains(NSSearchPathDirectory.DocumentDirectory, NSSearchPathDomainMask.UserDomainMask, true).last! as NSString).stringByAppendingPathComponent("account.archive")
        //        读取的文件    要转成 HMUserAccount
        let reuset = NSKeyedUnarchiver.unarchiveObjectWithFile(path) as?
        HMUserAccount
        
        return reuset
    }

}